package ictius.menu;

import ictius.demonio.Informante;
import ictius.elemenos.Lector;
import ictius.elemenos.Libro;
import ictius.elemenos.Pedido;
import ictius.elemenos.Prestamo;
import ictius.estructuras.implement.ColaVector;
import ictius.estructuras.implement.Listado;
import ictius.estructuras.implement.PilaVector;
import ictius.excepciones.DesapilaException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Esta clase se encarga de tratar con los objetos creados en <code>CargaElemento</code>.
 * <p>Los objetos serán recibidos para ser guardados en la estructura que corresponde a cada uno.
 * Cada elemento pertenecea una estructura en particular.</p>
 * @author tadeo
 *
 */
public class ControlEstructuras {

    /**
     * <code>PilaVector</code> almacena elementos de tipo <code>Prestamo</code>.
     */
    public static PilaVector prestamo = new PilaVector();
    /**
     * <code>ColaVector</code> almacena elementos de tipo <code>Pedido</code>
     */
    public static ColaVector pedido = new ColaVector();
    /**
     * <code>Listado</code> almacena elementos que no requieren un orden especial como ser
     * <code>Lector</code> y <code>Libro</code>.
     */
    public static Listado libracus = new Listado();
    /**
     * <code>Listado</code> almacena elementos que no requieren un orden especial como ser
     * <code>Lector</code> y <code>Libro</code>.
     */
    public static Listado lectores = new Listado();
    
    private static  Lector lectron = new Lector();
    private static Libro papiro = new Libro();
    
    int tam = libracus.size();

    /**
     * Almacena un libro en la Lista.
     * @param book
     */
    public static void almacenarLibro(Libro book) {
        libracus.add(book);
    }

    /**
     * Almacena un lector en la Lista.
     * @param lectio 
     */
    public static void almacenarLector(Lector lectio) {
        lectores.add(lectio);
    }

    /**
     * Almacena un pedido de <i>libro</i> ne la Pila.
     * @param neces 
     */
    public static void almacenarPedido(Pedido neces) {
        pedido.insertar(neces);
    }

    /**
     * Almacena un prestamo en una Cola.
     * @param loan 
     */
    public static void almacenarPrestamo(Prestamo loan) {
        prestamo.apilar(loan);
        System.out.println("Se ha registrado el prestamo correctamente.");
    }

    /**
     * Este método recorre la lista mostrando los títulos de los libros uno por uno.
     */
    public static void listarLibros() {
        Informante.asustar("Listando a los libros por título.");
        for (int i = libracus.size(); i > 0; i--) {
            papiro = (Libro) libracus.get(i);
            System.out.println(papiro.getTitulo());

        }
    }

    /**
     * Este método recorre la lista mostrando los nombres y apellidos de cada lector.
     */
    public static void listarLectores() {
        Informante.asustar("Listando a los lectores por Apellido y nombre");
        for (int i = lectores.size(); i > 0; i--) {
            lectron = (Lector) lectores.get(i);
            System.out.println(lectron.getApellido() + ", " + lectron.getNombre());

        }
    }

    /**
     * Este método elimina de la <code>Pila</code> un prestamo registrado anteriormente.
     * @throws DesapilaException
     */
    public static void quitarPrestamo() {
        Prestamo temp = new Prestamo();
        Informante.asustar("Se va a quitar un prestamo");
        try {
            temp = (Prestamo) prestamo.desapila();
            System.out.println("El lector " + temp.getUnLector().getNombre() + " " +
                    temp.getUnLector().getAddress() + " ha devuelto el libro " 
                    + temp.getEsteLibro().getTitulo());
        } catch (Exception ex) {
            Logger.getLogger(ControlEstructuras.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("Se ha eliminado último prestamo registrado.");
    }

    /**
     * Este método elimina de la <code>Pila</code> un Pedido registrado anteriormente.
     * @throws Exception 
     */
    public static void quitarPedido() {
        Pedido temp = new Pedido();
        Informante.asustar("Se va a quitar un pedido de la ColaVector");
        try {
            temp = (Pedido) pedido.quitarPrimer();
            temp.getEncargado().setPrestado(false);
            System.out.println("El lector " + temp.getPretendiente().getNombre() + " " +
                    temp.getPretendiente().getApellido()
                    + " ha rechazado el libro " + temp.getEncargado().getTitulo());

        } catch (Exception e) {
            System.out.println("Explotó quitarPedido()!!");
        }
    }
}
